package edu.towson.cosc.cosc455.ddange1.markdowncompiler;

import java.util.*;
import edu.towson.cosc.cosc455.interfaces.LexicalAnalyzer;

public class myLexicalAnalyzer implements LexicalAnalyzer {
	private char thisChar = '-'; //current char
	private HashSet<String> validTokens;
	private String[] validTokensArray;
	
	public myLexicalAnalyzer(){
		validTokens = new HashSet<String>();
		validTokens.add("#START DOCUMENT"); validTokens.add("#END DOCUMENT");
		validTokens.add("#START HEAD"); validTokens.add("#END HEAD");
		validTokens.add("#START TITLE"); validTokens.add("#END TITLE");
		validTokens.add("#START PARAGRAPH"); validTokens.add("#END PARAGRAPH");
		validTokens.add("#START BOLD"); validTokens.add("#END BOLD");
		validTokens.add("#START ITALICS"); validTokens.add("#END ITALICS");
		validTokens.add("#START LIST"); validTokens.add("#END LIST");
		validTokens.add("#START ITEM"); validTokens.add("#END ITEM");
		validTokens.add("#NEWLINE"); 
		validTokens.add("#START AUDIO"); validTokens.add("#END AUDIO");
		validTokens.add("#START VIDEO"); validTokens.add("#END VIDEO");
		validTokens.add("#START DEFINE"); validTokens.add("#END DEFINE");
		validTokens.add("#VALUE"); validTokens.add("#NAME"); 
		validTokens.add("#START USE"); validTokens.add("#END USE");
		
		validTokensArray = validTokens.toArray(new String[0]);
	}
	
	public void getNextToken() {
		thisChar = getCharacter();
		while(isSpace(thisChar)){
			thisChar = getCharacter();
		}
		if(thisChar == '#'){  //tag
			addCharacter();
			thisChar = getCharacter();
			while((!lookupToken()) && (thisChar != '#')){
				addCharacter();
				if(!compiler.fileText.isEmpty()){
					thisChar = getCharacter();
				}
			}
		}
		else{  //text
			while((thisChar != '#') && (compiler.fileText.length() != 1)){
				addCharacter();
				thisChar = getCharacter();
			}
		}
		if(!compiler.fileText.isEmpty()){
			compiler.fileText = thisChar + compiler.fileText;
		}
	}

	public char getCharacter() {
		//gets the next char
		thisChar = compiler.fileText.charAt(0);
		compiler.fileText = compiler.fileText.substring(1);
		return thisChar;
	}

	public void addCharacter() {
		//adds the char to the String
		compiler.token = compiler.token + thisChar; 
	}

	public boolean isSpace(char c) {
		boolean isSpace = false;
		if((c == ' ') || (c == '\t') || (c=='	')){
			isSpace = true;
		}
		return isSpace;
	}
	
	public boolean lookupToken() {
		//checks whether or not the token is valid
		boolean lookupToken = false;
		//hash set of valid tags
		for(int i = 0; i < validTokensArray.length; i++){
			if(compiler.token.equalsIgnoreCase(validTokensArray[i])){
				lookupToken = true;
			}
		}
		return lookupToken;
	}

	public boolean isText(String someText){
		boolean isText = true;
		if(someText.charAt(0) == '#'){
			isText = false;
		}
		return isText;
	}
	
	public boolean isEmptySpace(String s){
		boolean isEmpty = true;
		for(int i = 0; i < s.length(); i++){
			if(!isSpace(s.charAt(i))){
				isEmpty = false;
			}
		}
		return isEmpty;
	}
	
	public void clearLexer(){
		compiler.token = "";
		thisChar='-';
	}
}
